<?php
/**
 * JoiGallery - image gallery component for Joostina
 *
 * Backend controller
 *
 * @version 1.0 alpha 12
 * @package JoiGallery
 * @subpackage	Admin
 * @filename admin.joigallery.php
 * @author JoostinaTeam
 * @copyright (C) 2008-2009 Joostina Team
 * @license see license.txt
 *
 **/

defined('_VALID_MOS') or die();

require_once ($mainframe->getPath('class'));

//Подключаем файл стилей административной части компонента
$mainframe->addCSS(_JOI_GALLERY_ADMIN_SITE.'/css/joigallery-admin.css' );

$task = mosGetParam($_REQUEST, 'task');
$act  = mosGetParam($_REQUEST, 'act');
$cid  = mosGetParam($_REQUEST, 'cid', array(0));

if (!is_array($cid)) $cid = array($cid);

switch ($act) {
    case 'categories':
        _categories($task, $cid);
        break;
    case 'photos':
        _photos($task, $cid);
        break;    
    case 'configuration':
        _configuration($task, $cid);
        break;
    case 'tools':
        show_tools($option);
        break;
    case 'plugins':
        _plugins($task, $cid);
        break;
    case 'extrafields':
        _extrafields($task, $cid);
        break;
    case 'thumbs':
        _thumbs($task, $cid);
        break;
    case 'about':
        show_about();
        break;
    default:
        mosRedirect('index2.php?option='.$option.'&amp;act=photos');
        break;
}

function _photos($task, $cid) {
    global $option;

    switch ($task) {
        case 'new':
            add_item();
            break;
        case 'edit':
            edit_item($cid[0]);
            break;
        case 'move':
            move_photo($cid);
        break;
        case 'savemove':
            save_move_photo($cid);
        break;
        case 'apply':
        case 'save':
            save_item();
            break;
        case 'remove':
            remove_photo($cid);
            break;
        case 'cancel':
            mosRedirect('index2.php?option='.$option.'&amp;act=photos');
            break;
        case 'orderup':
            reorder_photo($cid[0], -1);
            break;
        case 'orderdown':
            reorder_photo($cid[0], 1);
            break;
        case 'saveorder':
            saveOrder_photos($cid);
            break;
        case 'publish':
            setState_photo($cid, 1);
            break;
        case 'unpublish':
            setState_photo($cid, 0);
            break;
        case 'upload':
            _process_upload();
            break;
        default:
            show_item_list_cache();
            break;
    }
}


function _categories($task, $cid) {
    global $option;

    switch ($task) {
        case 'new':
            edit_category(0);
            break;
        case 'edit':
            edit_category($cid[0]);
            break;
		case 'move':
            move_category($cid);
        break;
        case 'savemove':
            save_move_category($cid);
        break;	
        case 'apply':
        case 'save':
            save_category();
            break;
        case 'remove':
            remove_category($cid);
            break;
        case 'cancel':
            mosRedirect('index2.php?option='.$option.'&amp;act=categories');
            break;
        case 'orderup':
            reorder_category($cid[0], -1);
            break;
        case 'orderdown':
            reorder_category($cid[0], 1);
            break;
        case 'saveorder':
            saveOrder_category($cid);
            break;
        case 'publish':
            setState_category($cid, 1);
            break;
        case 'unpublish':
            setState_category($cid, 0);
            break;
        default:
            show_category_list_cache();
            break;
    }
}

function _configuration($task, $cid) {
    global $option;

    switch ($task) {
        case 'save':
        case 'apply':
            save_config($option, $task);
            break;
        case 'cancel':
            mosRedirect('index2.php?option='.$option.'&amp;act=configuration');
            break;
        case 'new':
            config($option, 1);
            break;
        case 'config':
            config($option);
            break;
        case 'remove':
            remove_config($cid, $option);
            break;
        default:
            config_list($option);
            break;
    }
}

function _plugins($task, $cid) {
    global $option;

    switch ($task) {
        case 'apply':
        case 'save':        
            save_plugin($option, $task);
            break;
        case 'cancel':
            mosRedirect('index2.php?option='.$option.'&amp;act=plugins');
            break;
        case 'plugin':
            plugin($option);
            break;
        case 'remove':
            remove_plugin($cid, $option);
            break;
        default:
            plugins_list($option);
            break;
    }
}

function _extrafields($task, $cid) {
    global $option;

    switch ($task) {

        case 'save':
        case 'apply':
            save_extrafield($option, $task);
            break;
        case 'cancel':
            mosRedirect('index2.php?option='.$option.'&amp;act=extrafields');
            break;
        case 'new':
            extrafield($option, 0);
            break;
        case 'extrafield':
            extrafield($option, $cid[0]);
            break;
        case 'remove':
            remove_extrafield($cid, $option);
            break;
        case 'publish':
            setState_extrafield($cid[0], 1);
            break;
        case 'unpublish':
            setState_extrafield($cid[0], 0);
            break;
        default:
            extrafield_list($option);
            break;
    }
}

function _thumbs($task, $cid) {
    global $option;

    switch ($task) {
        case 'thumbuild':
            thumb_rebuild();
            break;       
//        case 'cancel':
//            //mosRedirect('index2.php?option='.$option.'&amp;act=tools');
//            show_tools($option);
//            break;
        default:
            show_thumb_master($option);
            break;
    }
}


/* ------------------------------------------------------------- */ 
/* -------------------------- КАТЕГОРИИ ------------------------ */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Отображение списка всех категорий
*
****************************************/
 function show_category_list_cache() {
  global $option;
  
  $mainframe = &mosMainFrame::getInstance();

  $limit = intval($mainframe->getUserStateFromRequest("viewlistlimit", 'limit', $mainframe->getCfg('list_limit')));
  $limitstart = intval($mainframe->getUserStateFromRequest("view{$option}limitstart", 'limitstart', 0));
  $cid = intval($mainframe->getUserStateFromRequest("view{$option}cid", 'cid', 0));

  $cache = &mosCache::getCache('com_content');
  $r = $cache->call('show_category_list', $cid, $limit, $limitstart);

  // подключаем библиотеку сжатия html-кода
  //mosMainFrame::addLib('html_optimize');  
  //$r = html_optimize($r);  
  //$r = compress($r);
  
  from_cache($r);
  unset($r);
  return;
}


function show_category_list() {
  global $option;

  $mainframe = &mosMainFrame::getInstance();
  $database = &database::getInstance();

  $limit = intval($mainframe->getUserStateFromRequest("viewlistlimit", 'limit', $mainframe->getCfg('list_limit')));
  $limitstart = intval($mainframe->getUserStateFromRequest("view{$option}limitstart", 'limitstart', 0));
  //$cid = intval($mainframe->getUserStateFromRequest("view{$option}cid", 'cid', 0));
  $cid = intval(mosGetParam($_GET,'cid','0'));
  $search = $mainframe->getUserStateFromRequest("search{$option}", 'search', '');
  $search = $database->getEscaped(trim(strtolower($search)));
  
  //Загружаем конфигурацию
  $params = new joiGalleryConfig($database);
  
  //Директория изображений для формирования миниатюр списка категорий админки  
  $thumb_source = $params->get($params->get('adm_cat_list_thumbs_source'));  

  $photos = new joiGalleryPhoto ($database);//для получения количества изображений в категории  

  $cat = new joiGalleryCategory($database);

  //$helper = new joiGalleryHelper;  
  
  //Получаем список всех категорий
  $rows = $cat->get_categories_admin($cid, $search);

  //Пересортировываем категории с учетом отношений родитель/потомок
  $category_tree = $cat->generate_tree($rows);

  //Подсчет количества категорий
  $total = count($category_tree);

  //Подключение класса нумерации страниц
  require_once (JPATH_BASE.'/administrator/includes/pageNavigation.php');
  $pageNav = new mosPageNav($total, $limitstart, $limit);

  //Разбиваем категории по страницам
  $rows = array_slice($category_tree, $pageNav->limitstart, $pageNav->limit);

  $categories = $cat->getCategoryTree();
  $obj = new stdClass();
  $obj->id = 0;
  $obj->name = _C_JOIGALLERY_ALL;
  array_unshift($categories, $obj);

  $lists = array();
  $lists['search'] = $search;
  $lists['cid'] = mosHTML::selectList($categories, 'cid', 'onchange="document.adminForm.submit();"', 'id', 'name', $cid);

  include_once (_JOI_GALLERY_ADMIN_BASE.DS.'view'.DS.'category_list.php');

}


/***************************************
*
* Добавление/Редактирование категории
*
* @param int $id
*
****************************************/
function edit_category($id) {
  global $my, $option;

  $database = &database::getInstance();

  $row = new mosCategory($database);
  $row->load($id);

  if (!$row->id) $row->published = 1;

  //Получаем массив метаданных из поля "params" и разделяем его на составляющие
  $meta = explode( '|||',stripslashes($row->params) );
  $meta[0] = !empty($meta[0]) ? $meta[0] : '';
  $meta[1] = !empty($meta[1]) ? $meta[1] : '';
  $meta[2] = !empty($meta[2]) ? $meta[2] : '';

  $categories = joiGalleryCategory::getCategoryTree();
  $obj = new stdClass();
  $obj->id = 0;
  $obj->name = '&nbsp;&mdash;&nbsp;'._C_JOIGALLERY_CATEGORY_ROOT.'&nbsp;';

  array_unshift($categories, $obj);
 
  $lists = array();
  $lists['parent_id'] = mosHTML::selectList($categories, 'parent_id', 'class="inputbox" size="1"', 'id', 'name', $row->parent_id);
  $lists['published'] = mosHTML::yesnoRadioList('published', '', intval($row->published));

  include_once (_JOI_GALLERY_ADMIN_BASE.DS.'view'.DS.'category_form.php');
}


/***************************************
*
* Сохранение категории
* 
****************************************/
function save_category() {
  global $task, $option, $my;

  $mainframe = &mosMainFrame::getInstance();
  $database = &database::getInstance();

  $row = new mosCategory($database);
  $row->bind($_POST);

  if (!$row->id) $row->ordering = 999999999;  

  // Избегаем ссылки категории на саму себя
  if ($row->parent_id == $row->id) {
      $row->parent_id = 0;
  }

  $row->section = 'com_joigallery';
  
  //Удалям пробелы из начала и конца строки 
  $row->name  = trim($row->name);
  $row->title = trim($row->title);  

  //Получаем метаданные  
  $meta_title = trim( $mainframe->getUserStateFromRequest("meta_title",'meta_title',''));
  $meta_desc = trim( $mainframe->getUserStateFromRequest("meta_desc",'meta_desc',''));
  $meta_kw = trim( mb_strtolower ( $mainframe->getUserStateFromRequest("meta_kw",'meta_kw','' )));
  
  //Формируем массив, и записываем его в поле "params", разделяя данные "|||"
  $array = array($meta_title, $meta_desc, $meta_kw);
  $row->params = implode("|||", $array);

  $row->published = intval(mosGetParam($_REQUEST, 'published', 0));

  if (!$row->check()) {
      echo "<script> alert('" . $row->getError() . "'); window.history.go(-1); </script>\n";
      exit();
  }
  if (!$row->store()) {
      echo "<script> alert('" . $row->getError() . "'); window.history.go(-1); </script>\n";
      exit();
  }

  $row->updateOrder('section = \'com_joigallery\'');
  
  //Очистка кэша списка категорий 
  mosCache::cleanCache('com_content');
  
  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');

  switch ($task) {
      case 'save':
          mosRedirect('index2.php?option=' . $option . '&amp;act=categories', _C_JOIGALLERY_MSG_CATEGORY_SAVED);
          break;
      case 'apply':
          mosRedirect('index2.php?option=' . $option . '&amp;act=categories&amp;task=edit&amp;cid=' . $row->id . '&amp;hidemainmenu=1',
              _C_JOIGALLERY_MSG_CATEGORY_UPDATED);
          break;
  }

}


/***************************************
*
* Удаление категорий
*
* @param array $cid
*
****************************************/
function remove_category($cid) {
  global $option;

  $database = &database::getInstance();

  $row = new mosCategory($database);
  $photos = new joiGalleryPhoto($database);

  for ($i = 0, $n = count($cid); $i < $n; $i++) {
      $id = $cid[$i];

      //Проверяем наличие изображений
      $total = $photos->check_photos_by_cat($id);

      if ($total > 0) {
          echo "<script> alert('" . addslashes(_C_JOIGALLERY_CATEGORY_DELETE_STILL_PHOTOS) . "'); window.history.go(-1); </script>\n";
          exit();
      }

      //Проверяем наличие подкатегории
      $total = $photos->check_subcats_by_cat($id);

      if ($total > 0) {
          echo "<script> alert('" . addslashes(_C_JOIGALLERY_CATEGORY_DELETE_STILL_SUBCATS) . "'); window.history.go(-1); </script>\n";
          exit();
      }

      $row->delete($id);
  }

  //Очистка кэша списка категорий 
  mosCache::cleanCache('com_content');
  
  mosRedirect('index2.php?option='.$option.'&act=categories', _C_JOIGALLERY_MSG_CATEGORIES_DELETED);

}


/***************************************
*
* Публикация/Скрытие категорий
*
* @param array $ids
* @param int $published
*
****************************************/
function setState_category($ids, $published) {
  global $option;

  $database = &database::getInstance();
  
  $row = new mosCategory($database);

  for ($i = 0, $n = count($ids); $i < $n; $i++) {

      $row->load($ids[$i]);
      $row->published = $published;

      if (!$row->store()) {
          echo "<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n";
          exit();
      }
  }
  
  //Очистка кэша списка категорий 
  mosCache::cleanCache('com_content');
  
  mosRedirect('index2.php?option='.$option.'&amp;act=categories');
}


/***************************************
*
* Изменение очередности категорий (порядок)
*
* @param int $id
* @param int $direction
*
****************************************/
function reorder_category($id, $direction) {
  global $option;

  $database = &database::getInstance();

  $row = new mosCategory($database);
  $row->load($id);

  $row->move($direction, 'section = \'com_joigallery\'');
  
  //Очистка кэша списка категорий 
  mosCache::cleanCache('com_content');
  
  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');

  mosRedirect('index2.php?option='.$option.'&amp;act=categories');
}


/***************************************
*
* Сохранение очередности категорий (порядок)
*
* @param array $cid
*
****************************************/
function saveOrder_category($cid) {
  global $option;

  $database = &database::getInstance();

  $order = mosGetParam($_POST, 'order', array(0));
  $row = new mosCategory($database);
  $conditions = array();

  for ($i = 0, $n = count($cid); $i < $n; $i++) {
      $row->load($cid[$i]);

      if ($row->ordering != $order[$i]) {
          $row->ordering = $order[$i];

          if (!$row->store()) {
              echo "<script> alert('".$database->getErrorMsg()."'); window.history.go(-1); </script>\n";
              exit();
          }

          $condition = "section = 'com_joigallery'";
          $found = false;

          for ($j = 0, $k = count($conditions); $j < $k; $j++) {
              $cond = $conditions[$j];

              if ($cond[1] == $condition) {
                  $found = true;
                  break;
              }
          }
		  
          if (!$found) $conditions[] = array($row->id, $condition);
          
      }
  }

  for ($i = 0, $n = count($conditions); $i < $n; $i++) {
      $condition = $conditions[$i];

      $row->load($condition[0]);
      $row->updateOrder($condition[1]);
  }

  //Очистка кэша списка категорий 
  mosCache::cleanCache('com_content');
  
  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');
  
  mosRedirect('index2.php?option='.$option.'&amp;act=categories');
}


/***************************************
*
* Список перемещаемых категорий
*
* @param array $cid
*
****************************************/
function move_category ($cid) {
  global $option;

  $mainframe = &mosMainFrame::getInstance();
  $database = &database::getInstance();

  $limit = intval($mainframe->getUserStateFromRequest("viewlistlimit", 'limit', $mainframe->getCfg('list_limit')));
  $limitstart = intval($mainframe->getUserStateFromRequest("view{$option}limitstart", 'limitstart', 0));
  
  //Загружаем конфигурацию
  $params = new joiGalleryConfig($database);  
  
  //Директория изображений для формирования миниатюр списка категорий админки  
  $thumb_source = $params->get($params->get('adm_cat_list_thumbs_source'));  
  
  $items = new joiGalleryPhoto($database);
  
  $cat = new joiGalleryCategory($database);
  $total = count($cid);

  require_once (JPATH_BASE.'/administrator/includes/pageNavigation.php');
  $pageNav = new mosPageNav($total, $limitstart, $limit);
  
  //Получаем список всех категорий
  $ids = implode(',', $cid); 
  $rows = $cat->get_categories_admin($ids,true);
  
  $categories = joiGalleryCategory::getCategoryTree();
  $obj = new stdClass();
  $obj->id = 0;
  $obj->name = _C_JOIGALLERY_SELECT_CATEGORY_ROOT;
  array_unshift($categories, $obj);

  $lists = array();
  $lists['cid'] = mosHTML::selectList($categories, 'catid', '', 'id', 'name');
 
  include_once (_JOI_GALLERY_ADMIN_BASE.DS.'view'.DS.'category_move.php');
   
}


/***************************************
*
* Перемещение категорий
*
* @param array $cid
*
****************************************/
function save_move_category ($cid) {
    global $option;

    $mainframe = &mosMainFrame::getInstance();
    $database = &database::getInstance();
    //Загружаем конфигурацию
    //$params = new joiGalleryConfig($database);

    //Получаем ID целевой категории
    $catid = (int)$mainframe->getUserStateFromRequest("catid", 'catid', 0);  
	//echo $catid;
    $cat = new joiGalleryCategory($database);
	
    //Название категории
    $cat_name = $cat->get_cat_field_by_cid($catid,'name');
	
	//Счетчик количества перемещаемых категорий
	$count = count($cid);

    for ($i = 0, $n = count($cid); $i < $n; $i++) {
        
		$cat->load($cid[$i]);
		
		//Запрещаем перемещение категории в саму себя 
		if ($cat->id == $catid) { $count--; continue; }
		
		//Записываем новый parent_ID категории в базу        
		$cat->parent_id = $catid;
        //$cat->updateOrder('cid = '.$catid);
		$cat->updateOrder("section = 'com_service'");
        //$condition = "section = 'com_service'";
        if (!$cat->store())
            mosRedirect('index2.php?option='.$option.'&amp;act=categories', $cat->getError());
      
    }//for
	
	//Очистка кэша списка категорий 
    mosCache::cleanCache('com_content');
	
	//Очистка кэша списка объектов 
    mosCache::cleanCache('com_joigallery_admin_item_list');
	
    $msg = ($cat_name) ? sprintf(_C_JOIGALLERY_ADM_MSG_CATS_MOVED, $cat_name, $count) 
	     :  sprintf(_C_JOIGALLERY_ADM_MSG_CATS_MOVED_PARENT, count($cid));
    mosRedirect('index2.php?option='.$option.'&amp;act=categories', $msg);
}  


/* ------------------------------------------------------------- */ 
/* --------------------------- ОБЪЕКТЫ ------------------------- */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Отображение списка всех объектов
*
****************************************/
 function show_item_list_cache() {
  global $option;

  $mainframe = &mosMainFrame::getInstance();

  $limit = intval($mainframe->getUserStateFromRequest("viewlistlimit", 'limit', $mainframe->getCfg('list_limit')));
  $limitstart = intval($mainframe->getUserStateFromRequest("view{$option}limitstart", 'limitstart', 0));
  $cid = intval($mainframe->getUserStateFromRequest("view{$option}cid", 'cid', 0));

  $cache = &mosCache::getCache('com_joigallery_admin_item_list');
  $r = $cache->call('show_item_list', $cid, $limit, $limitstart);

  // подключаем библиотеку сжатия html-кода
  //mosMainFrame::addLib('html_optimize');  
  //$r = html_optimize($r);
  
  //$r = compress($r);
  
  from_cache($r);
  unset($r);
  return;
}

function show_item_list() {
  global $option;

  $mainframe = &mosMainFrame::getInstance();
  $database  = &database::getInstance();

  $limit = intval($mainframe->getUserStateFromRequest("viewlistlimit", 'limit', $mainframe->getCfg('list_limit')));
  $limitstart = intval($mainframe->getUserStateFromRequest("view{$option}limitstart", 'limitstart', 0));
  $cid = intval($mainframe->getUserStateFromRequest("view{$option}cid", 'cid', 0));

  //Загружаем конфигурацию
  $params = new joiGalleryConfig($database);

  //Директория изображений для формирования миниатюр списка изображений админки
  $thumb_source = $params->get($params->get('adm_img_list_thumbs_source'));
   
  $photos = new joiGalleryPhoto($database);
  $total = $photos->get_count_photos_admin($cid);

  require_once (JPATH_BASE.'/administrator/includes/pageNavigation.php');
  $pageNav = new mosPageNav($total, $limitstart, $limit);

  $rows = $photos->load_photos_admin($cid, $limitstart, $limit);

  $categories = joiGalleryCategory::getCategoryTree();
  $obj = new stdClass();
  $obj->id = 0;
  $obj->name = _C_JOIGALLERY_ALL;
  array_unshift($categories, $obj);

  $lists = array();
  $lists['cid'] = mosHTML::selectList($categories, 'cid', 'onchange="document.adminForm.submit();"', 'id', 'name', $cid);

  include_once (_JOI_GALLERY_ADMIN_BASE.DS.'view'.DS.'item_list.php');
}


/***************************************
*
* Загрузка/добавление объекта
*
****************************************/
function add_item() {
  global $option;

  $mainframe = &mosMainFrame::getInstance();
  $database = &database::getInstance();
  $config = new joiGalleryConfig($database);
  
  //Выясняем выбранную пользователем категорию, для предварительного выбора в выпадающем списке
  $cid = intval($mainframe->getUserStateFromRequest("view{$option}cid", 'cid', 0));

  $lists = array();
  $categories = joiGalleryCategory::getCategoryTree();
  $lists['cid'] = mosHTML::selectList($categories, 'cid', 'class="inputbox text_area"', 'id', 'name', $cid);

  //echo '<pre>'; print_r($config->allow_formats); echo '</pre>';//Проверка

  $options = array(mosHTML::makeOption('name', _C_JOIGALLERY_SORT_AZ), mosHTML::makeOption('rname', _C_JOIGALLERY_SORT_ZA), mosHTML::makeOption
      ('c_date', _C_JOIGALLERY_SORT_CREATED), mosHTML::makeOption('m_date', _C_JOIGALLERY_SORT_MODIFIED));
  $lists['sort'] = mosHTML::selectList($options, 'sort', 'class="inputbox text_area"', 'value', 'text', 'name');

  include_once (_JOI_GALLERY_ADMIN_BASE.DS.'view'.DS.'item_add.php');
}


/***************************************
*
* Редактирование объекта
*
* @param int $id
*
****************************************/
function edit_item($id) {
  global $option;

  $mainframe = &mosMainFrame::getInstance();
  $database = &database::getInstance();  
  
  //Загружаем конфигурацию
  $params = new joiGalleryConfig($database);
  
  //Директория изображений для формирования миниатюр списка изображений админки  
  $thumb_source = $params->get($params->get('adm_img_form_thumbs_source'));

  $row = new joiGalleryPhoto($database);
  $row->load($id);

  $categories = joiGalleryCategory::getCategoryTree();
  $obj = new stdClass();
  $obj->id = 0;
  $obj->name = _C_JOIGALLERY_SELECT;
  array_unshift($categories, $obj);

  $lists = array();
  $lists['cid'] = mosHTML::selectList($categories, 'cid', '', 'id', 'name', $row->cid);

  include_once (_JOI_GALLERY_ADMIN_BASE.DS.'view'.DS.'item_form.php');
}


/***************************************
*
* Сохранение объекта
*
****************************************/
function save_item() {
  global $option, $task;

  $database = &database::getInstance();

  $row = new joiGalleryPhoto($database);
  $row->bind($_POST);

  $row->default = intval(mosGetParam($_REQUEST, 'default', 0));
  
  $row->meta_title = trim( $row->meta_title );
  $row->meta_desc  = trim( $row->meta_desc );
  $row->meta_kw    = trim( mb_strtolower ( $row->meta_kw ));

  if ($row->default) {
      $row->clean_default($row->cid);
  }

  if (!$row->id) {
      $row->ordering = 999999999;
  }

  if (!$row->check()) {
      echo "<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n";
      exit();
  }
  if (!$row->store()) {
      echo "<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n";
      exit();
  }

  $row->updateOrder('cid = '.(int)$row->cid);
  
  //Очистка кэша списка категорий 
  mosCache::cleanCache('com_content');
  
  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');

  switch ($task) {
      case 'save':
          mosRedirect('index2.php?option='.$option.'&amp;act=photos', _C_JOIGALLERY_MSG_IMAGE_SAVED);
          break;
      case 'apply':
          mosRedirect('index2.php?option='.$option.'&amp;act=photos&amp;task=edit&amp;cid='.$row->id.'&amp;hidemainmenu=1', _C_JOIGALLERY_MSG_IMAGE_UPDATED);
          break;
  }
}


/***************************************
*
* Список перемещаемых объектов
*
* @param array $cid
*
****************************************/
function move_photo($cid) {
  global $option;

  $mainframe = &mosMainFrame::getInstance();
  $database = &database::getInstance();

  $limit = intval($mainframe->getUserStateFromRequest("viewlistlimit", 'limit', $mainframe->getCfg('list_limit')));
  $limitstart = intval($mainframe->getUserStateFromRequest("view{$option}limitstart", 'limitstart', 0));
  
  //Загружаем конфигурацию
  $params = new joiGalleryConfig($database);
  
  //Директория изображений для формирования миниатюр списка изображений админки  
  $thumb_source = $params->get($params->get('adm_img_list_thumbs_source'));
  
  $photos = new joiGalleryPhoto($database);  
  $total = count($cid);

  require_once (JPATH_BASE.'/administrator/includes/pageNavigation.php');
  $pageNav = new mosPageNav($total, $limitstart, $limit);

  //$cat = new joiGalleryCategory($database);

  $ids = implode(',', $cid);
  $rows = $photos->load_photos_by_id($ids);

  $categories = joiGalleryCategory::getCategoryTree();
  $obj = new stdClass();
  $obj->id = 0;
  $obj->name = _C_JOIGALLERY_SELECT;
  array_unshift($categories, $obj);

  $lists = array();
  $lists['cid'] = mosHTML::selectList($categories, 'catid', 'id="catid"', 'id', 'name');

  include_once (_JOI_GALLERY_ADMIN_BASE.DS.'view'.DS.'item_move.php');   
}


/***************************************
*
* Перемещение объектов
*
* @param array $cid
*
****************************************/
function save_move_photo ($cid) {
    global $option;

    $mainframe = &mosMainFrame::getInstance();
    $database = &database::getInstance();
    $config = new joiGalleryConfig($database);

    //Получаем ID целевой категории
    $catid = (int)$mainframe->getUserStateFromRequest("catid", 'catid', 0);

    //Директория изображений
    //$dir_joigallery = JPATH_BASE.'/images/joigallery';
    //Директория оригиналов
    $dir_original = JPATH_BASE.'/'.$config->original_path;
    //Директория средних эскизов
    $dir_middle = JPATH_BASE.'/'.$config->image_path;
    //Директория миниатюр
    $dir_thumb = JPATH_BASE.'/'.$config->thumbnail_path;
    //Директория водяных знаков
    $dir_watermark = JPATH_BASE.'/images/joigallery/watermark';

    //Проверяем директории
    $dirs = array($dir_original.'/'.$catid, $dir_middle.'/'.$catid, $dir_thumb.'/'.$catid, $dir_watermark);
    foreach($dirs as $dir) {
      //Проверяем существует ли директория, если нет - создаем
      if( !is_dir($dir) ) {
          mkdir($dir, 0755);
      }
      //Проверяем права на запись директории
      elseif (!is_writable($dir)) {
          joiGalleryError::error(_C_JOIGALLERY_MSG_UPLOAD_ERR_DIR_NOT_WRITABLE.': '.$dir);
      }
      //Копируем index.html в директорию
      if (!file_exists($dir.'/index.html')) {
          copy (JPATH_BASE.'/administrator/components/com_joigallery/index.html',
                $dir.'/index.html');
      }
    }

    $cat = new joiGalleryCategory($database);
    //Название категории
    $cat_name = $cat->get_cat_field_by_cid($catid,'name');

    $row = new joiGalleryPhoto($database);

    for ($i = 0, $n = count($cid); $i < $n; $i++) {

        $row->load($cid[$i]);

        //Разделяем текуший адрес изображения на подстроки
        $file = explode ('/',$row->path);

        //Переносим изображения в новые категории
        rename($dir_original.'/'.$row->path, $dir_original.'/'.$catid.'/'.$file[1]);
        rename($dir_middle.'/'.$row->path, $dir_middle.'/'.$catid.'/'.$file[1]);
        rename($dir_thumb.'/'.$row->path, $dir_thumb.'/'.$catid.'/'.$file[1]);

        //Записываем новый адрес изображения в базу
        $row->path = $catid.'/'.$file[1];

        //Записываем новый ID категории в базу
        $row->cid = $catid;
        $row->updateOrder('cid = '.$catid);

        if (!$row->store())
            mosRedirect('index2.php?option='.$option.'&amp;act=photos', $row->getError());
      
    }//for
	
	//Очистка кэша списка категорий 
    mosCache::cleanCache('com_content');
	
	//Очистка кэша списка объектов 
    mosCache::cleanCache('com_joigallery_admin_item_list');
	
	if (count($cid) == 1) $msg = sprintf(_C_JOIGALLERY_MSG_IMAGE_MOVED, $cat_name);  
    else              $msg = sprintf(_C_JOIGALLERY_MSG_IMAGES_MOVED, count($cid), $cat_name);	
    
    mosRedirect('index2.php?option='.$option.'&amp;act=photos', $msg);
}


/***************************************
*
* Удаление объектов
*
* @param array $ids
*
****************************************/
function remove_photo($ids) {
  global $database, $option, $mainframe;

  $row    = new joiGalleryPhoto($database);
  $config = new joiGalleryConfig($database);

  for ($i = 0, $n = count($ids); $i < $n; $i++) {
      $id = intval($ids[$i]);

      $row->load($id);
      $row->remove_images($row, $config);
      $row->delete();
      $row->updateOrder('cid = '.$row->cid);
  }
  
  //Очистка кэша списка категорий 
  mosCache::cleanCache('com_content');
  
  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');
  
  mosRedirect('index2.php?option='.$option.'&amp;act=photos', _C_JOIGALLERY_MSG_IMAGES_DELETED);
}


/***************************************
*
* Публикация/скрытие объектов
*
* @param array $ids
* @param int $published
*
****************************************/
function setState_photo($ids, $state) {
  global $database, $option;

  $row = new joiGalleryPhoto($database);

  for ($i = 0, $n = count($ids); $i < $n; $i++) {

      $row->load($ids[$i]);

      $row->state = $state;

      if (!$row->store()) {
          echo "<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n";
          exit();
      }
  }

  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');
  
  mosRedirect('index2.php?option='.$option.'&amp;act=photos');
}


/***************************************
*
* Изменение очередности объектов (порядок)
*
* @param int $id
* @param int $direction
*
****************************************/
function reorder_photo($id, $direction) {
  global $database, $option;

  $row = new joiGalleryPhoto($database);
  $row->load($id);

  $row->move($direction, 'cid = '.(int)$row->cid);

  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');
  
  mosRedirect('index2.php?option='.$option.'&amp;act=photos');
}


/***************************************
*
* Сохранение очередности объектов (порядок)
*
* @param array $cid
*
****************************************/
function saveOrder_photos($cid) {
  global $database, $option;

  $order = mosGetParam($_POST, 'order', array(0));
  $row = new joiGalleryPhoto($database);
  $conditions = array();

  for ($i = 0, $n = count($cid); $i < $n; $i++) {
      $row->load($cid[$i]);

      if ($row->ordering != $order[$i]) {
          $row->ordering = $order[$i];

          if (!$row->store()) {
              echo "<script> alert('".$database->getErrorMsg()."'); window.history.go(-1); </script>\n";
              exit();
          }

          $condition = 'cid = '.(int)$row->cid;
          $found = false;

          for ($j = 0, $k = count($conditions); $j < $k; $j++) {
              $cond = $conditions[$j];

              if ($cond[1] == $condition) {
                  $found = true;
                  break;
              }
          }
          if (!$found) {
              $conditions[] = array($row->id, $condition);
          }
      }
  }

  for ($i = 0, $n = count($conditions); $i < $n; $i++) {
      $condition = $conditions[$i];

      $row->load($condition[0]);
      $row->updateOrder($condition[1]);
  }

  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');
  
  mosRedirect('index2.php?option='.$option.'&amp;act=photos');
}


function _process_upload() {
  global $option;
  
  $mainframe = &mosMainFrame::getInstance();
  $database = &database::getInstance();

  //Получаем ID целевой категории
  $cid = (int)$mainframe->getUserStateFromRequest("cid", 'cid', 0);

  $cat = new joiGalleryCategory($database);
  
  //Название категории
  $cat_name = $cat->get_cat_field_by_cid($cid,'name');

  $return = processImage::upload_handler(false);

  if ($return == 1) $msg = sprintf(_C_JOIGALLERY_MSG_IMAGE_ADDED, $cat_name);  
  else              $msg = sprintf(_C_JOIGALLERY_MSG_IMAGES_ADDED, $return, $cat_name);
  
  
  //Очистка кэша списка категорий 
  mosCache::cleanCache('com_content');
  
  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');
  
  mosRedirect('index2.php?option='.$option.'&amp;act=photos&amp;task=new', $msg);
}


/* ------------------------------------------------------------- */ 
/* ------------------------- ПЛАГИНЫ --------------------------- */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Отображение списка всех плагинов
*
****************************************/
function plugins_list($option) {

  $mainframe = &mosMainFrame::getInstance();

  $plugins = new joiGalleryPlugins($mainframe);
  $plugins_list = $plugins->get_plugins_list();
  $plugins_array = $plugins->config->_all_configs;

  $limit = intval(mosGetParam($_REQUEST, 'limit', 0));
  $limitstart = intval(mosGetParam($_REQUEST, 'limitstart', 0));
  require_once(JPATH_BASE.'/administrator/includes/pageNavigation.php');
  $pageNav = new mosPageNav(count($plugins_list), $limitstart, $limit);

  include_once(JPATH_BASE.DS.'administrator'.DS.'components'.DS.$option.DS.'view'.DS.'plugin_list.php');

    	    
}


/***************************************
*
* Редактирование/Настройка плагина
*
* @param string $option
*
****************************************/
function plugin($option) {

  $mainframe = &mosMainFrame::getInstance();
  $database  = &database::getInstance();

  $plug = mosGetParam($_REQUEST,'plugin','');
  $type = mosGetParam($_REQUEST,'type','');

  $plugin = new joiPlugins($database, 'joigallery', $plug, $type);
  $plugin->config->display_config($option);
}


/***************************************
*
* Сохранение плагина
*
* @param string $option
* @param $task
*
****************************************/
function save_plugin($option, $task) {

  $database = &database::getInstance();

  $plug = mosGetParam($_REQUEST,'plugin','');
  $type = mosGetParam($_REQUEST,'type','');

  $plugin = new joiPlugins($database, 'joigallery', $plug, $type);
  $plugin->config->save_config($option);

  switch ($task) {
      case 'save':
          mosRedirect('index2.php?option='.$option.'&amp;act=plugins', _C_JOIGALLERY_MSG_PLUGIN_SAVED);
          break;
      case 'apply':
          mosRedirect('index2.php?option='.$option.'&amp;act=plugins&amp;task=plugin&amp;plugin='.$plug.'&amp;type='.$type, _C_JOIGALLERY_MSG_PLUGIN_UPDATED);
          break;
  }

}


/* ------------------------------------------------------------- */ 
/* -------------------- ДОПОЛНИТЕЛЬНЫЕ ПОЛЯ -------------------- */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Список дополнительных полей
*
* @param string $option
*
****************************************/
function extrafield_list($option) {

  $mainframe = &mosMainFrame::getInstance();

  $extra_fields = new joiExtraFields($mainframe, 'com_joigallery');
  $extra_fields->load_fields();
  $extrafield_list = $extra_fields->_loaded_fields;
  include_once(JPATH_BASE.DS.'administrator'.DS.'components'.DS.$option.DS.'view'.DS.'extrafield_list.php');
}


/***************************************
*
* Добавление/Редактирование дополнительного поля
*
* @param string $option 
* @param int $id
*
****************************************/
function extrafield($option, $id) {
  $mainframe = &mosMainFrame::getInstance();
  $field = new joiExtraFields($mainframe, 'com_joigallery');
  $field->load($id);
  include_once(JPATH_BASE.DS.'administrator'.DS.'components'.DS.$option.DS.'view'.DS.'extrafield_form.php');
}


/***************************************
*
* Сохранение дополнительного поля
*
* @param string $option 
* @param $task
*
****************************************/
function save_extrafield($option, $task) {

  $mainframe = &mosMainFrame::getInstance();

  $field = new joiExtraFields($mainframe, 'com_joigallery');
  $field->bind($_POST);
  $field->published = intval(mosGetParam($_REQUEST, 'published', 0));

  if (!$field->id && !$field->check()) {
    echo "<script> alert('".$field->getError()."'); window.history.go(-1); </script>\n";
    exit();
  }
  if (!$field->store()) {
    echo "<script> alert('".$field->getError()."'); window.history.go(-1); </script>\n";
    exit();
  }

  switch ($task) {
    case 'save':
        mosRedirect('index2.php?option='.$option.'&amp;act=extrafields', _C_JOIGALLERY_MSG_EXTRAFIELD_SAVED);
        break;
    case 'apply':
        mosRedirect('index2.php?option='.$option.'&amp;act=extrafields&task=extrafield&cid='.$field->id, _C_JOIGALLERY_MSG_EXTRAFIELD_UPDATED);
        break;
  }

}


/***************************************
*
* Публикация/Скрытие дополнительных полей
*
* @param array $ids
* @param int $published
*
****************************************/
function setState_extrafield($ids, $published) {
  global $option;

  $mainframe = &mosMainFrame::getInstance();
  $database  = &database::getInstance();

  $row = new joiExtraFields($mainframe, 'com_joigallery');
  for ($i = 0, $n = count($ids); $i < $n; $i++) {

      $row->load($ids[$i]);

      $row->published = $published;

      if (!$row->store()) {
          echo "<script> alert('" . $row->getError() . "'); window.history.go(-1); </script>\n";
          exit();
      }
  }

  mosRedirect('index2.php?option=' . $option . '&amp;act=extrafields');
}


/***************************************
*
* Удаление дополнительных полей
*
* @param array $сid
* @param string $option
*
****************************************/
function remove_extrafield($cid, $option) {
    
    $mainframe = &mosMainFrame::getInstance();
    $database  = &database::getInstance();
    
    $row = new joiExtraFields($mainframe, 'com_joigallery');

    for ($i = 0, $n = count($cid); $i < $n; $i++) {
        $id = $cid[$i];       
        $row->delete($id);
        $row->delete_values($id);
    }
    
    mosRedirect('index2.php?option='.$option.'&amp;act=extrafields' , _C_JOIGALLERY_MSG_EXTRAFIELDS_DELETED);
    
}


/* ------------------------------------------------------------- */ 
/* -------------------------- НАСТРОЙКИ ------------------------ */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Список всех конфигураций
*
* @param string $option
*
****************************************/
function config_list($option) {

  $mainframe = &mosMainFrame::getInstance();
  $configs = joiGalleryConfig::get_configs_list();

  $limit = intval(mosGetParam($_REQUEST, 'limit', 0));
  $limitstart = intval(mosGetParam($_REQUEST, 'limitstart', 0));
  require_once(JPATH_BASE.'/administrator/includes/pageNavigation.php');
  $pageNav = new mosPageNav(count($configs), $limitstart, $limit);

  include_once(JPATH_BASE.DS.'administrator'.DS.'components'.DS.$option.DS.'view'.DS.'config_list.php');
	
}

/***************************************
*
* Создание/Редактирование конфигурации
*
* @param string $option
* @param int $isNew
*
****************************************/
function config($option, $isNew = 0) {

  $mainframe = &mosMainFrame::getInstance();
  $database = &database::getInstance();
  $group = mosGetParam($_REQUEST,'group','default');

  $config = new joiGalleryConfig($database, 'joigallery', $group);
  $config->display_config($option, $isNew);
}


/***************************************
*
* Сохранение конфигурации
*
* @param string $option
* @param int $isNew
*
****************************************/
function save_config($option, $task) {

  $database = &database::getInstance();
  $group = mosGetParam($_REQUEST,'group','default');

  $config = new joiGalleryConfig($database, 'joigallery', $group);
  $config->save_config();
  
  //Очистка кэша списка категорий 
  mosCache::cleanCache('com_content');

  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');

  switch ($task) {
      case 'save':
          mosRedirect('index2.php?option='.$option.'&amp;act=configuration', _C_JOIGALLERY_MSG_CONFIG_SAVED);
          break;
      case 'apply':
          mosRedirect('index2.php?option='.$option.'&amp;act=configuration&amp;task=config&amp;group='.$group, _C_JOIGALLERY_MSG_CONFIG_UPDATED);
          break;
  }

}


/***************************************
*
* Удаление конфигураций
*
* @param array $ids
* @param string $option
*
****************************************/
function remove_config($ids, $option){
    
  for($i = 0,$n = count ($ids); $i < $n; $i ++){
      echo $ids[$i];
      joiGalleryConfig::delete_config($ids[$i]);
  }

  //Очистка кэша списка категорий 
  mosCache::cleanCache('com_content');
	
  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');
  
  mosRedirect('index2.php?option=' . $option . '&amp;act=configuration' , _C_JOIGALLERY_MSG_CONFIGS_DELETED);
}


/* ------------------------------------------------------------- */ 
/* ------------------------ ИНСТРУМЕНТЫ ------------------------ */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Отображение страницы всех инструментов
*
****************************************/
function show_tools($option) {
  
  $mainframe = &mosMainFrame::getInstance();

  function show_icon ($tool, $name, $task=null) {
    global $option;
	
	$task = ($task) ? '&amp;task='.$task : '';
		
    echo '<span>
            <a href="index2.php?option='.$option.'&amp;act='.$tool.$task.'">
              <img src="'._JOI_GALLERY_ADMIN_SITE.'/tools/'.$tool.'/images/cpanel/icon.png" border="0" alt="" />
              '.$name.'
            </a>
          </span>';   
  }
  
  require_once (_JOI_GALLERY_ADMIN_BASE.'/view/tools.php');
}


/***************************************
*
* Страница мастера эскизов
*
****************************************/
function show_thumb_master ($option) {
  
  $mainframe = &mosMainFrame::getInstance();
  $database  = &database::getInstance();

  //Загружаем конфигурацию
  $params = new joiGalleryConfig($database);
  
  //echo $params->get('max_width');

  //Позиция водяного знака
  $list['watermak_position'] = $params->get_wmark_list();

  require_once (JPATH_BASE.'/administrator/includes/pageNavigation.php');
  
  $categories = joiGalleryCategory::getCategoryTree();
  $obj = new stdClass();
  $obj->id = 0;
  $obj->name = _C_JOIGALLERY_SELECT;
  array_unshift($categories, $obj);

  $lists = array();
  $lists['cid'] = mosHTML::selectList($categories, 'catid', '', 'id', 'name');

  require_once (_JOI_GALLERY_ADMIN_BASE.'/view/thumbs_form.php');
}


/***************************************
*
* Функция мастера эскизов
*
****************************************/
function thumb_rebuild() {
  global $option;

  $return = thumbMaster::upload_handler();

  //if ($return == 1) $msg = _C_JOIGALLERY_MSG_IMAGE_ADDED;  
  //else              $msg = _C_JOIGALLERY_MSG_IMAGES_ADDED.'&nbsp;('.$return.').';   
  
  //TODO Временная мера. Подсчет должен производиться по итогам работы
  $return = ($return-1)* 2;//функций класса thumbMaster. Сейчас возвращается количество
  $return = 'Успешо восстановленных изображений: '.$return;//обработанных оригиналов.
  
  mosRedirect('index2.php?option='.$option.'&amp;act=thumbs', $return);
  
  //Очистка кэша списка категорий 
  mosCache::cleanCache('com_content');
  
  //Очистка кэша списка объектов 
  mosCache::cleanCache('com_joigallery_admin_item_list');
  
  //mosRedirect('index2.php?option='.$option.'&amp;act=thumbs', $msg);
}


/* ------------------------------------------------------------- */ 
/* ------------------------- ИНФОРМАЦИЯ ------------------------ */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Страница информации о компоненте
*
****************************************/
function show_about() {
  
  $mainframe = &mosMainFrame::getInstance();

  //Подключаем языковой файл описания компонента
  if (file_exists($lang_about = _JOI_GALLERY_FRONT_BASE.'/language/'.$mainframe->getCfg('lang').'/about.php'))
       $lang_about = $lang_about;
  else $lang_about = _JOI_GALLERY_FRONT_BASE.'/language/english/about.php';

  require_once ($lang_about);
}


/* ------------------------------------------------------------- */ 
/* ------------------------- КЭШИРОВАНИЕ ----------------------- */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Извлечение из кэша
*
****************************************/
 function from_cache($cache) {
  $meta = new contentMeta($cache['params']);
  $meta->set_meta();
  echo $cache['content'];
  return false;
}


/***************************************
*
* Сжатие HTML-кода
*
****************************************/
// function compress($buffer) {
	// $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
	// $buffer = str_replace(array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $buffer);
	// return $buffer;
// }  

?>